package com.unionbigdata.teaching.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 通用 API 返回结果封装类。
 *
 * @param <T> 数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 成功编码 */
    public static final int SUCCESS_CODE = 200;

    /** 失败编码 */
    public static final int FAIL_CODE = 500;

    /** 编码：成功为 200，失败为其它数字 */
    private int code;

    /** 消息：成功或错误信息 */
    private String msg;

    /** 数据内容 */
    private T data;

    /** 默认成功消息 */
    private static final String SUCCESS_MSG = "success";

    /** 默认失败消息 */
    private static final String FAIL_MSG = "fail";

    /**
     * 创建一个不包含数据的成功结果。
     *
     * @param <T> 数据类型
     * @return 成功的结果对象
     */
    public static <T> ApiResult<T> ok() {
        return new ApiResult<>(SUCCESS_CODE, SUCCESS_MSG, null);
    }

    /**
     * 创建一个包含数据的成功结果。
     *
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return 成功的结果对象
     */
    public static <T> ApiResult<T> ok(T data) {
        return new ApiResult<>(SUCCESS_CODE, SUCCESS_MSG, data);
    }

    /**
     * 创建一个失败的结果。
     *
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败的结果对象
     */
    public static <T> ApiResult<T> fail(String msg) {
        return new ApiResult<>(FAIL_CODE, msg, null);
    }

    /**
     * 创建一个带有自定义编码和错误信息的失败结果。
     *
     * @param code 错误编码
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败的结果对象
     */
    public static <T> ApiResult<T> fail(int code, String msg) {
        return new ApiResult<>(code, msg, null);
    }

    /**
     * 创建一个带有默认错误信息的失败结果。
     *
     * @param <T> 数据类型
     * @return 失败的结果对象
     */
    public static <T> ApiResult<T> fail() {
        return new ApiResult<>(FAIL_CODE, FAIL_MSG, null);
    }
}